package com.ljx.offer;

import java.util.LinkedList;

/**
 * @author 李捷禧
 * Date: 2023/3/16
 * ClassName: C_2
 */

public class C_24{
        public ListNode reverseList(ListNode head) {

                return null;
        }

        public static void main(String[] args) {
                // 头结点 初始化为-1，
                ListNode listNode = new ListNode(-1);
                ListNode res = listNode;
                // 创建链表 0->1->2->null
                for (int i = 0; i < 3; i++) {
                     res.next = new ListNode(i);
                     res = res.next;
                }
                // 第一个节点是随便填的值（-1），所以需要从下一个节点开始
                ListNode listNode1 = reverseList3(listNode.next);
                while (listNode1 != null) {
                        System.out.println(listNode1.val);
                        listNode1 = listNode1.next;
                }
        }

        /**
         * 直接进行替换
         * @param head
         * @return
         */
        public static ListNode reverseList3(ListNode head) {
                // 方便理解，变量名与图保持一致
                ListNode before = null, a = head;

                while (a != null) {
                        // 记住要先把旧数据取出
                        ListNode after = a.next;
                        // 再进行赋值，不然后面的数据就丢失了
                        a.next = before;

                        // 下一次，before变成了a
                        before = a;
                        // 下一次循环是从after开始的
                        a = after;
                }
                // 结束循环的时候是a等于null的时候，a之前是不是有效的翻转后的链表，所以返回before
                return before;
        }

        /**
         * 教你链表的头插法,
         * @param head
         * @return
         */
        public static ListNode reverseList2(ListNode head) {
                ListNode rs = null;
                while (head != null) {
                        ListNode next = rs;
                        // 扩展，能否不重新创建对象。直接使用head对象，更改为倒序？
                        rs = new ListNode(head.val);
                        rs.next = next;
                        head = head.next;
                }
                return rs;
        }

        /**
         * 暴力解法
         * @param head
         * @return
         */
        public static ListNode reverseList1(ListNode head) {
                LinkedList<Integer> list = new LinkedList<>();
                while(head != null){
                        list.addLast(head.val);
                        head = head.next;
                }
                ListNode listNode = new ListNode(0),res = listNode;
                while(!list.isEmpty()) {
                        res.next = new ListNode(list.removeLast());
                        res = res.next;
                }
              return listNode.next;
        }


}
class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
                val = x;
        }
}
